package com.pilipala.controller;

import com.pilipala.dto.SearchDTO;
import com.pilipala.dto.UserDTO;
import com.pilipala.dto.UserLoginDTO;
import com.pilipala.dto.UserPrivateDTO;
import com.pilipala.result.PageResult;
import com.pilipala.result.Result;
import com.pilipala.service.UserService;
import com.pilipala.vo.UserLoginVO;
import com.pilipala.vo.UserVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
@RequestMapping("/api/user")
@Slf4j
@Tag(name = "用户相关接口")
public class UserController {

    @Autowired
    public UserService userService;

    /**
     *
     * 用于登录业务
     * @param userLoginDTO 包括 email 必须、type 必须、 password 非必须、code 非必须
     * @return 返回一个token
     */
    @PostMapping("/login")
    @Operation(summary = "登录接口",description = "有账户的话登录，没有账户的话就是注册顺便登录")
    public Result<UserLoginVO> Login(@RequestBody UserLoginDTO userLoginDTO){
        log.info("---登录中---{}",userLoginDTO);
        UserLoginVO userLoginVo = userService.login(userLoginDTO);
        return Result.success(userLoginVo);
    }

    /**
     * 更新除了密码以外的用户信息
     * @param userDTO 除了密码以外的用户信息
     * @return 无
     */
    @PutMapping("/update")
    @Operation(summary = "更新用户其他信息",description = "除了密码以外的信息")
    public Result<?> updateUser(@RequestBody UserDTO userDTO){
        log.info("更新用户信息");
        userService.update(userDTO);
        return Result.success();
    }

    /**
     * 更新密码
     * @param passwordDTO 密码、邮箱、验证码
     * @return 无
     */
    @PutMapping("/updatePrivate")
    @Operation(summary = "修改用户密码和账户")
    public Result<?> updatePrivate(@RequestBody UserPrivateDTO passwordDTO){
        log.info("修改密码");
        userService.updatePrivate(passwordDTO);
        return Result.success();
    }

    /**
     * 根据Id获取用户信息
     * @param id 用户Id
     * @return 返沪用户数据，但是不能包括密码
     */
    @GetMapping("/getUser/{id}")
    @Operation(summary = "获取用户信息",description = "只有Id")
    public Result<UserVO> getUserById(@PathVariable Long id){
        log.info("查询用户,用户Id{}",id);
        UserVO userVO = userService.getUserById(id);
        return Result.success(userVO);
    }


    /**
     * 上传用户头像
     * @param file 图片文件
     * @return 无
     */
    @PostMapping("/uploadAvatar")
    @Operation(summary = "上传用户头像")
    public Result<?> uploadAvatar(MultipartFile file){
        log.info("上传文件:{}",file.getName());
        userService.uploadAvatar(file);
        return Result.success();
    }


    /**
     * 关注用户
     * @param followedId 被关注人的Id
     * @return 无
     */
    @GetMapping("/follow/{followedId}")
    @Operation(summary = "关注用户接口")
    public Result<?> followUser(@PathVariable Long followedId){
        log.info("关注用户中----被关注人的用户Id{}",followedId);
        userService.follow(followedId);
        return Result.success();
    }


    /**
     * 获取关注人的Id
     * @param searchDTO 有效数据只有页码和页大小
     * @return 获取到分页后的数据
     */
    @GetMapping("/getFollowed")
    @Operation(summary = "获取关注人的Id")
    public Result<PageResult> getFollowed(SearchDTO searchDTO){
        log.info("获取关注人的Id----{}",searchDTO);
        PageResult pageResult = userService.getFollowed(searchDTO);
        return Result.success(pageResult);
    }
}







